iT邦幫忙

2024 iThome 鐵人賽

DAY 0
0
生成式 AI

除了ChatGPT,你了解生成式AI的其他應用嗎?30天從零到精通的學習與實作系列 第 24

Day24 利用RAG架構建立本地端問答機器人__程式碼跑不出來

  • 分享至 

  • xImage
  •  

這次使用python來撰寫將文件匯入、訊息處理,以及問答系統介面配置的流程,並且將語言模型版本存在json配置檔案裡。實際執行後發現訊息顯示找不到模式的檔案,不知道是哪邊出了問題,但還是想把程式碼寫出來。

# 匯入所需的套件
import json
import gradio as gr

from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import PromptTemplate
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import FastEmbedEmbeddings
from langchain_community.vectorstores.utils import filter_complex_metadata
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

這段程式碼匯入了需要的函式庫,包括 json 用於處理 JSON 文件,gradio 用於構建用戶界面,和 LangChain 社區提供的其他庫,用於處理聊天模型、文件加載、向量存儲和嵌入。

# 創建提示模板
promptTemplate = """Answer the question as precise as possible using the provided context. If the answer is
    not contained in the context, say "answer not available in context" \n\n
    Context: {context}
    Question: {question}
    Answer:

     """
modelSel = ""

這裡定義了一個提示模板,將用於生成回答問題的提示。模板中包含上下文和問題,並指定如何回答問題。

# 將 PDF 文件載到 ChromaDB
def loadDataFromPDFFile(filePath):
    loader = PyPDFLoader(filePath)
    pages = loader.load_and_split()
    chunks = filter_complex_metadata(pages)
    vector_store = Chroma.from_documents(documents=chunks, embedding=FastEmbedEmbeddings())
    return vector_store

這段程式碼定義了loadDataFromPDFFile函數,從指定的 PDF 文件中加載數據。它使用 PyPDFLoader 加載和拆分頁面,然後過濾元數據,最後將結果存儲到 Chroma 向量存儲中。

# 生成模型的回應
def modelResponse(message , history):
    llm = ChatOllama(model = conf["model"])

    prompt = PromptTemplate(template=promptTemplate , input_variables=["context","question"])

    # 初始化檢索器
    #網址改成自己pdf檔的檔案位址
    dbLoaded = loadDataFromPDFFile("~/Desktop/網球社期初社大成果報告書.pdf")
    retriever = dbLoaded.as_retriever(search_type="similarity_score_threshold" , search_kwargs = {
        "k": 5,
        "score_threshold": 0.2
    })
    # 準備上下文訊息
    context = retriever   # 假設這裡獲取上下文作為字串

    # 準備消息
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": context},
        {"role": "user", "content": message},
    ]

    # 用消息調用模型
    response = llm.invoke(messages)
    return StrOutputParser().parse(response)

這段程式碼定義了一個函數,負責處理用戶的訊息並生成回應。首先,通過 ChatOllama 創建聊天模型,然後從 PDF 文件中加載數據並建立檢索器。接著,構建包含系統和用戶訊息的消息列表,最後調用模型並解析其回應。

if __name__ == "__main__":

    # 讀取模型配置文件
    conf = {}
    with open("config.json" , "r") as confFile:
        conf = json.load(confFile)
        print(conf["model"])

    # 問答系統標題
    chatUI = gr.ChatInterface(fn=modelResponse , title="網球社成果報告 Q&A", type='messages')
    chatUI.launch()

這部分程式碼檢查是否在主執行環境中運行。如果是,則讀取配置文件,並加載模型設定。接著,使用 Gradio 創建一個聊天介面,並啟動該介面,讓用戶可以進行互動。

建構的config.json程式碼是放model的名稱,如下:

{
    "model": "llama2"
}

上一篇
Day23 利用RAG架構建立本地端問答機器人__套件介紹
下一篇
Day25 利用RAG架構建立本地端問答機器人__安裝套件&執行檔案
系列文
除了ChatGPT,你了解生成式AI的其他應用嗎?30天從零到精通的學習與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言